using System;
using System.Collections.Generic;

namespace GameLogic
{
    /// <summary>
    /// 想要获取到的字符数据，
    /// </summary>
    public enum ResponseDataType { Json, Text }

    /// <summary>
    /// Log等级
    /// </summary>
    public enum LogLevel { Full, None, Url }

    /// <summary>
    /// 与服务器约定的自定义HTTP请求状态码
    /// </summary>
    public enum HttpStatusCode
    {
        /// <summary>
        /// 标准成功响应
        /// </summary>
        Success = 200,

        /// <summary>
        /// 特殊情况：请求应被忽略（非实际HTTP状态码）
        /// </summary>
        Ignore = 0,

        /// <summary>
        /// 用户登录已失效（非实际HTTP状态码）
        /// </summary>
        LoginExpired = 9617
    }

    /// <summary>
    /// 配置项，某些参数是与服务器约定
    /// </summary>
    public static class HttpConfig
    {
        public static float DefaultTimeout = 20f;

        /// <summary>
        /// http请求，服务器默认使用的状态码key字段
        /// </summary>
        public static string CodeKey = "code";
        /// <summary>
        /// http请求，服务器默认使用的接口附带信息key字段
        /// </summary>
        public static string MessageKey = "msg";
    }

    // 定义错误回调参数
    public class HttpResponseArgs
    {
        /// <summary>
        /// 是否成功
        /// </summary>
        public bool Success;
        /// <summary>
        /// 数据
        /// 成功时为结果；失败时为错误描述
        /// </summary>
        public object Data { get; set; }
        /// <summary>
        /// UnityWebRequestException错误时才会赋值，错误码
        /// </summary>
        public int? Status { get; set; }
    }

    public class HttpCommonOptions
    {
        #region 回调方法参数

        /// <summary>
        /// 请求成功时调用。参数：返回的数据。
        /// </summary>
        public Action<HttpResponseArgs> OnSuccess { get; set; }

        /// <summary>
        /// 请求失败时调用。参数：错误msg，HTTP状态码。
        /// </summary>
        public Action<HttpResponseArgs> OnError { get; set; }

        /// <summary>
        /// 请求发送前调用，返回 true 表示阻止发送。
        /// </summary>
        public Action BeforeSend { get; set; }

        /// <summary>
        /// 请求被取消时调用。
        /// </summary>
        public Action OnAbort { get; set; }

        /// <summary>
        /// 请求完成后无论成功与否都会调用。参数：是否成功，响应对象。
        /// </summary>
        public Action<HttpResponseArgs> OnFinally { get; set; }

        #endregion

        #region 配置

        /// <summary>是否显示加载窗口，默认 false。</summary>
        public bool ShowLoading { get; set; } = false;

        /// <summary>是否在切换场景时取消请求，默认 true。</summary>
        public bool CanBeAbort { get; set; } = true;

        /// <summary>请求超时时间（秒），默认 20。</summary>
        public float Timeout { get; set; } = HttpConfig.DefaultTimeout;

        /// <summary>日志打印级别，默认 Full。</summary>
        public LogLevel Log { get; set; } = LogLevel.Full;

        /// <summary>请求失败后重试次数，默认 1。</summary>
        public int RetryTime { get; set; } = 1;

        #endregion

        #region 请求结果判断

        /// <summary>
        /// 接口返回的code若是下列数组中的任意一个值则表示请求成功，此时会正常调用onSuccess回调
        /// </summary>
        public List<int> includeSuccessCodes { get; set; } = new List<int>((int)HttpStatusCode.Success);
        
        /// <summary>
        /// 若code包含于该变量中则会被忽略，数值与web服务器约定，不做任何操作
        /// </summary>
        public List<int> includeIgnoreCodes { get; set; } = new List<int>((int)HttpStatusCode.Ignore);

        /// <summary>响应数据格式类型，默认 Json。</summary>
        public ResponseDataType ResponseType { get; set; } = ResponseDataType.Json;

        #endregion
    }

    public class HttpGetOptions : HttpCommonOptions
    {
        /** 请求携带参数,会使用format方法来将params中的元素依次替换进url的占位符中 */
        public string[] paramList { get; set; } = Array.Empty<string>();
    }

    public class HttpPostOptions : HttpCommonOptions
    {
        public object paramList;
        //public bool useJsonObject;
        //public string[] headers;
    }
}